Trabajando con Notebooks, datos y Python¶

Rodolfo Ferro
ferro@cimat.mx
Líder técnico del Bootcamp de Ciencia de Datos @ Código Facilito

Notebooks¶

Seguramente has escuchado de ellos si vas comenzando con Python o incluso si ya llevas algo de tiempo trabajando con ello.

Recordando, un notebook es una aplicación web que permite crear y compartir documentos interactivos que contienen código, texto, ecuaciones, visualizaciones y otros elementos multimedia.

Es una herramienta bastante popular para la ciencia de datos, el aprendizaje automático y la investigación, ya que permite a usuarios combinar código, resultados y explicaciones en un solo lugar.

No description has been provided for this image           No description has been provided for this image No description has been provided for this image No description has been provided for this image

El objetivo de esta charla es compartirte 7 características que hacen de los notebooks una poderosa herramienta para trabajar con Python y datos.

Descripción de la imagen

El caso de estudio

¿Puede una neurona artificial predecir si un estudiante aprobará una materia? 📚🤖

Con solo dos datos —horas de estudio y calificaciones previas— de múltiples estudiantes entrenamos una neurona simple para aprender la frontera de decisión entre aprobar y reprobar.

1. Acceso rápido a librerías y datos 📦¶

  • Importas, cargas, analizas y visualizas datos en minutos.
  • Integración perfecta con pandas, numpy, sklearn, tensorflow, requests, etc.
  • En Colab: puedes conectarte a Google Drive, cargar datasets desde URLs o montarlos desde tu computadora fácilmente.

⚡ "Del CSV al gráfico en 5 líneas de código."

Para nuestro caso de estudio, importaremos algunas bibliotecas para simular algunos datos, visualizar y entrenar una neurona artificial.

Comenzaremos con algunos imports, no importa si son de algunas paqueterías populares que tengamos instaladas o si son módulos propios, el notebook nos permitirá un acceso rápido a ello:

In [1]:
# Importamos la paquetería de Python que utilizaremos
import numpy as np
import ipywidgets as widgets
from IPython.display import display

from utils import plot_students
from utils import train_neuron
from utils import plot_history
from utils import plot_decision_boundary
from utils import predict_student

from functools import partial


# Fijamos una semilla aleatoria
np.random.seed(123)

Ahora, simularemos algunos datos de estudiantes, lo nos lleva al segundo punto.

2. Interactividad en tiempo real 🧠¶

  • Puedes ejecutar una celda, ver el resultado, ajustar y volver a correr.
  • Ideal para el pensamiento exploratorio y para enseñar: "¿Qué pasa si cambio este valor?"

🔁 "Código como conversación" — el notebook te responde en cada paso.

Para nuestro caso, podemos ejecutar este ejercicio con una cantidad diversa de estudiantes simulados, no importa si son 50, 500, 5000...

Podemos explorar de manera interactiva en cada paso gracias a nuestro notebook.

In [2]:
# Especificamos el tamaño de las muestras.
n = 500

# Crearemos dos variables a partir de una distribución normal:
#  → Horas de estudio ~ N(𝜇=5, 𝜎²=2)
#  → Promedio de calificaciones previas ~ N(𝜇=7.5, 𝜎²=1)
horas_estudio = np.random.normal(5, 2, n).clip(0, 10)
calif_previas = np.random.normal(7.5, 1, n).clip(0, 10)

# Con ello, creamos la matriz de entrada (para entrenar la neurona)
X = np.column_stack((horas_estudio, calif_previas))

print(f"[INFO] Cantidad de estudiantes simulados: {len(X)}")
[INFO] Cantidad de estudiantes simulados: 500

Podemos observar que la cantidad de estudiantes cambia de acuerdo al valor que definamos.

Continuando con nuestro ejemplo, crearemos un índice de estudio basado en la cantidad de horas de estudio y las calificaciones previas que tienen nuestros estudiantes.

Definiremos un criterio de relevancia 40/60 para las horas y calificación previa.

In [3]:
# Generamos la etiqueta: Índice de aprobación
indice_aprob = (0.4 * horas_estudio + 0.6 * calif_previas) / 10

# Si el índice de aprobación es mayor a 0.7, consieraremos al
# estudiante como aprobado
y_true = (indice_aprob > 0.7).astype(int)

# Total de estudiantes aprobados en los datos simulados:
print(f"[INFO] Total de estudiantes aprobados: {sum(y_true)}")
print(f"[INFO] Porcentaje de aprobación: {sum(y_true)/n*100:.2f}%")
[INFO] Total de estudiantes aprobados: 142
[INFO] Porcentaje de aprobación: 28.40%

Una vez creados estos datos, podemos explorarlos de manera gráfica, lo que nos lleva al tercer punto.

3. Visualizaciones integradas 🎨¶

  • Puedes generar gráficos interactivos y embebidos con bibliotecas como matplotlib, seaborn, plotly, altair.
  • No necesitas abrir otra ventana ni usar otro software.
  • ¡Tus gráficos pueden ser interactivos!

👁️ "Ver es entender" — las visualizaciones aparecen junto al código que las genera.

In [4]:
# Desplegamos un gráfico de dispersión de nuestros datos
fig_students = plot_students(horas_estudio, calif_previas, y_true)
fig_students.show()

Nota: Del grafico anterior podemos observar varios datos interesantes:

  • Notamos que el mínimo de horas dedicadas al estudio es de 0, sin embargo, podemos observar que nadie con esta cantidad de horas de estudio está aprobado. Por otro lado, notamos que el mínimo de horas estudiadas hasta que aparece el primer aprobado es de cerca de 4 horas de estudio. Esto puede sugerir que estudiar es un factor importante para aprobar.
  • Ahora, si bien podemos identificar a algunos estudiantes con un índice de aprobación positivo a pesar de tener un promedio de calificaciones bajo, notamos en esas mismas observaciones que dichos estudiantes tienen una cantidad considerable de horas de estudio, sugiriendo que estudiar puede ayudar a tener un índice de aprobación positivo.

4. Ideal para experimentación y prototipado 🧪¶

  • Puedes probar modelos, comparar resultados, hacer pruebas rápidas sin necesidad de un proyecto estructurado.
  • Muy útiles para testing de ideas, incluso en investigación o desarrollo temprano de productos.

🔬 "Pensamiento iterativo y curioso/explorativo."

🧠 ¿Qué hace una neurona artifical (perceptrón)?¶

Una neurona artificial es como una mini calculadora:

$$\hat{y} = \sigma (w_1 \cdot x_1 + w_2 \cdot x_2 + b)$$

Toma una entrada de información ($x_1 =$ horas de estudio, $x_2 =$ = promedio de calificaciones), opera utilizando un conjunto de parámetros llamados pesos y bias (o sesgo), y aplica una función sigmoide para producir una salida con valores entre 0 y 1. Este valor que arroja lo interpretaremos como el índice calculado para las entradas dadas (horas y calificación).

¡Ideal para clasificación!

Es importante señalar que la neurona desconoce los valores de los parámteros ya mencionados (pesos: $w_1$, $w_2$; bias: $b$). La neurona aprenderá cuáles son los valores ideales a partir de entrenarse con las observaciones que tenemos de los estudiantes.

Con esto en mente, podemos crear y entrenar una neurona artifical.

In [5]:
history, params = train_neuron(X, y_true, lr=0.1, epochs=10000)
w, b = params
100%|████████| 10000/10000 [00:00<00:00, 30422.50it/s, Epoch=9900, Loss=0.2]

Con esto, hemos entrenado una neurona artifical para pronosticar si un estudiante tiene un índice de aprobación positivo o negativo.

Como científicos de datos, nos interesa evaluar y conocer algunos detalles de nuestros modelos, por ejemplo, podemos desplegar la historia de entrenamiento:

In [6]:
# Desplegamos un gráfico con el entrenamiento de nuestro modelo
fig_training = plot_history(history)
fig_training.show()

Así como el gráfico anterior, podríamos desplegar otros más, como una matriz de confusión, un reporte de clasificación, entre otros, buscando evaluar el modelo a través de diferentes métricas.

Para nuestro caso de estudio, podemos desplegar la frontera de decisión aprendida.

In [7]:
# Desplegamos un gráfico con la frontera de decisión
fig_db = plot_decision_boundary(horas_estudio, calif_previas, y_true, w, b)
fig_db.show()

¡Y lo logra!

Después de entrenarse, la neurona aprende una frontera de decisión que separa ambos grupos. Esto nos indica que el modelo en buena manera es capaz de clasificar los resultados de los estudiantes.

Esa línea (aprendida por los pesos $w$ y el sesgo $b$) es lo que usa para decidir si alguien tiene un índide de aprobación positivo o negativo.

NOTA: 🧠 En general, así aprende una red neuronal artificial, ajustando los parámetros asociados a cada neurona que conforma la red.

5. Extensibilidad y herramientas adicionales 🧰¶

  • Widgets interactivos (ipywidgets) para sliders, menús, checkboxes.
  • Celdas mágicas (%%time, %%bash, etc.) para rendimiento, comandos, etc.
  • Plugins y extensiones que mejoran el desarrollo (nbextensions, jupyter-lab).

🛠️ Una herramienta que crece contigo conforme aprendes más.

Para nuestro caso de estudio, podemos explorar la predicción que realiza nuestro modelo con algunos datos de ejemplo de manera interactiva, por lo que aprovecharemos el uso de widgets para ello.

In [8]:
# Función parcial con w y b fijos
predict_student_fixed = partial(predict_student, w=w, b=b)

# Creamos sliders interactivos
horas_slider = widgets.FloatSlider(
    value=6.0, min=0.0, max=12.0, step=0.1,
    description="Horas estudio:", continuous_update=False
)
calif_slider = widgets.FloatSlider(
    value=8.5, min=0.0, max=10.0, step=0.1,
    description="Calificación:", continuous_update=False
)

# Mostramos los widgets y la función interactiva
ui = widgets.VBox([horas_slider, calif_slider])
out = widgets.interactive_output(predict_student_fixed, {
    "horas_estudio": horas_slider,
    "calif_previas": calif_slider
})
display(ui, out)
VBox(children=(FloatSlider(value=6.0, continuous_update=False, description='Horas estudio:', max=12.0), FloatS…
Output()

6. Markdown + código: narrativa viva 🧾¶

  • Permiten mezclar explicaciones en lenguaje natural (con texto, encabezados, listas, incluso fórmulas matemáticas) con el código y sus resultados.
  • Esto hace que el flujo sea muy didáctico y reproducible: es como leer un cuaderno de laboratorio interactivo.

✍️ Documentas lo que haces mientras lo haces.

En nuestro caso de estudio hemos podido exponer nuestro problema de manera sencilla y muy visual, y hemos podido ejecutar código de manera interactiva, explorando los resultados del problema que acabamos de resolver.¶

7. Compartibilidad y colaboración 🌎¶

  • En Google Colab (u otros) puedes compartir como si fuera un Google Doc: enlaces públicos, comentarios, permisos, etc.
  • En Jupyter, puedes versionarlo en GitHub, renderizarlo automáticamente (via nbviewer) o exportarlo a PDF/HTML.
  • Muy usado en cursos, artículos técnicos y publicaciones científicas.

🤝 “Mismo entorno, misma historia, mismos resultados.”

En mi caso, puedes explorar este notebook en:
https://rodolfoferro.xyz/python-fest-2025/index.html
Y por si no fue obvio, ¡estos slides fueron hechos con un notebook!

¡Muchas gracias!


Puedes contactarme a través de Ig o Tw(X):
@rodo_ferro

O por correo:
ferro@cimat.mx